#ifndef __DEVINFO_H__
#define __DEVINFO_H__
#include <rtthread.h>
#include <rtdevice.h>
#include "appconfig.h"

#define  MQTT_URL_SIZE    32  //mqtt URL 最大长度
#define  MQTT_PORT_SIZE   16
#define  MQTT_NAME_SIZE   32
#define  MQTT_PW_SIZE     32
#define  MQTT_ID_SIZE     32
#define  MQTT_TOPIC_SIZE  128

typedef enum
{
	STA_EXP = 0,
	STA_NOR = 1
}modbusStatusDef;

typedef enum
{
	DATA_CLOSE = 0,
	DATA_OPEN  = 1,
}modbusDataDef;

typedef enum
{
	INPROC_IDE = 0,
	INPROC_BUSY = 1,
}inprocStatusDef;//忙状态

typedef enum
{
	OPERATE_ERR = 0,
	OPERATE_OK = 1,
}operateResultDef;

typedef struct
{
	rt_int8_t 	status;    //状态 0 异常 1正常
	rt_uint8_t  per;       //执行动作进度条
	rt_uint8_t  inProcess; //0 空闲 1在忙着执行
	rt_uint8_t  data;      //自定义状态   0 关闭 1打开
	rt_int8_t  operateResult;//上次执行结果-1非法指令  0失败 1 成功
}moduleInfoDef;

typedef struct
{
	float data;//数据
}senserInfoDef;

typedef struct
{
	rt_uint16_t  wu;          //设置电压
	rt_uint16_t  ua;          //设置电流
	rt_uint8_t   fixtureSpeed;//归中板速度
	rt_uint32_t  fixtureTime; //归中板子时长
}sensorArgDef;

typedef struct 
{
	rt_uint8_t       vbat;          //电量
	rt_uint8_t       csq;           //4G信号
	rt_uint32_t      date;          //日期
	rt_int16_t       temp;          //温度
	moduleInfoDef    centerMotorA;  //归中杆A
	moduleInfoDef    centerMotorB;  //归中杆B
	moduleInfoDef    lifter;        //升降机
	moduleInfoDef    skylight;      //天窗/推杆
	moduleInfoDef    SwitchRC;      //遥控开关
	moduleInfoDef    SwichUAV;      //飞机开关
	moduleInfoDef    SwitchCharge;  //充电开关
	moduleInfoDef    eStop;         //紧急停机
	senserInfoDef    chargemA;      //充电电流
	senserInfoDef    chargeV;       //充电电压
	senserInfoDef    AvbatChargemA; //A电池充电电流
	senserInfoDef    BvbatChargemA; //B电池充电电流
	senserInfoDef    AvbatChargeV;  //A电池电压
	senserInfoDef    BvbatChargeV;  //B电池电压
	senserInfoDef    windDir;
	senserInfoDef    windSpeed;     //风速
	senserInfoDef    BatTemp;       //电池温度
	senserInfoDef    rainStatus;    //雨雪传感器
	moduleInfoDef    fan;           //风扇模块
	moduleInfoDef    airPump;       //气泵模块
}devDataDef;//这个是自身设备数据

typedef enum
{
	NET_TYPE_4G   = 0,
	NET_TYPE_LAN  = 1,
	NET_TYPE_WIFI = 2,
}devNetTypeDef;

typedef enum
{
	DEV_STA_NONET = 0,
	DEV_STA_NET,
	DEV_STA_LOGIN,
}devStatuDef;

typedef enum
{
	SERVER_TYPE_TCP = 0,
	SERVER_TYPE_MQTT,
}serverTypeDef;//服务器类型定义



typedef struct
{
	rt_uint8_t   url[MQTT_URL_SIZE];//mqtt的url
	rt_uint8_t   port[MQTT_PORT_SIZE];//mqtt的端口
	rt_uint8_t   account[MQTT_NAME_SIZE];//账户
	rt_uint8_t   pwd[MQTT_PW_SIZE];//密码
	rt_uint8_t   publish[MQTT_TOPIC_SIZE];//推送主题
	rt_uint8_t   subscribe[MQTT_TOPIC_SIZE];//订阅主题
}devMqttCfgDef;//mqtt配置定义


typedef struct
{
	rt_uint8_t   url[128];
	rt_uint16_t  port;
}devTcpCfgDef;//tcp配置定义

typedef struct
{
	rt_uint16_t centerMotorASpeed;//A电机速度
	rt_uint16_t centerMotorBSpeed;//B电机速度
	rt_uint16_t centerMotorADistance;//A电机运动距离
	rt_uint16_t centerMotorBDistance;//B电机运动距离
	rt_uint16_t centerMotorAOutTimeValue;//A电机运动超时值
	rt_uint16_t centerMotorBOutTimeValue;//B电机运动超时值
}devCfgDef;

typedef struct 
{
  rt_int16_t temp1;   //最下面室外温度
  rt_int16_t temp2;   //中间下室温度
  rt_int16_t temp3;   //上室温度
  rt_int16_t PTCTemp; //冰箱温度
  rt_int16_t setPTC;  //设置TPC温度
}thermostatsDef;//温控器定义



//#pragma pack(1)
typedef struct
{
	rt_uint16_t   saveFlag;   //保持标记
	rt_uint8_t    serverType; //0 TCP协议  1 mqtt协议
	devTcpCfgDef  tcpCFG;     //tcp 配置
	devMqttCfgDef mqttCFG;    //mqtt配置
	rt_bool_t     upgrade;    //系统升级
	devNetTypeDef netType;    //网卡类型
	rt_uint32_t   heartCyc;   //心跳数据周期
	rt_uint32_t   mac[24];    //设备MAC地址
	devDataDef    data;       //设备采集的数据
	rt_uint8_t    netStatus;//设备状态0 断网 1有网络 2上线
	rt_uint8_t    PCBType;    //PCB类型 0 电控板 1 遥控板 2表示飞机开关 4表示mini3
	rt_uint8_t    eStop;      //紧急停止 0表示不生效，1表示生效 2表示已经急停
	devCfgDef     config;     //设备配置信息
	thermostatsDef tempData;  //温度数据
	rt_uint8_t    modbusRTUAddr;//modbus 从机地址
}devInfoDef;


typedef struct
{
	rt_uint8_t  buf[sizeof(devInfoDef)+8];
	rt_uint16_t crc16;
}storDataCrcDef;

typedef union
{
	devInfoDef    arg;
	storDataCrcDef stor;//固定结构数据大小，可以实现升级后配置兼容
}devInfoStoreDef;


typedef struct
{
	rt_uint8_t ssid[32];
	rt_uint8_t pwd[32];
}wifiConfigDef;


typedef struct
{
	rt_uint16_t       saveFlag;
	wifiConfigDef     wifi;//WIFI配置
}appConfigDef;

typedef union
{
	devInfoDef     arg;
	storDataCrcDef stor;//固定结构数据大小，可以实现升级后配置兼容
}appCfgStoreDef;
void show_devinfo(void);

void get_mcu_mac(void);
void devinfo_release(void);
devInfoDef* devInfo_take(void);
void devTemp_init(void);

appConfigDef *appConfig_take(void);
void appConfig_release(void);
rt_err_t save_appConfig(void);
rt_err_t load_appConfig(void);

#endif

